/**
 * 
 */
package ar.utn.frgp.banco.front.action.cuentas;

import java.math.BigDecimal;

import ar.utn.frgp.banco.entity.Cuenta;
import ar.utn.frgp.banco.entity.enums.EstadoCuenta;
import ar.utn.frgp.banco.entity.enums.TipoCuenta;
import ar.utn.frgp.banco.exceptions.PersonalisedException;
import ar.utn.frgp.banco.front.action.EBAbstractAction;
import ar.utn.frgp.banco.service.GestionCuentasService;

/**
 * @author jlramirez
 *
 */
public class CrearCuentaAction extends EBAbstractAction {

	private static final long serialVersionUID = -398168937837355735L;
	
	
	private GestionCuentasService gestionCuentasService;
	
	
	private TipoCuenta tipo;
	
	private TipoCuenta[] tipoValues = TipoCuenta.values();
	
	private BigDecimal descubierto;
	
	public void validate(){
		
		if (tipo == null){
			addFieldError("tipo", getText("forms.requerido"));
		} else {
			try {
				if (TipoCuenta.CUENTA_CORRIENTE.equals(tipo)){
						if (tipo.getMaximo() <= gestionCuentasService.cantidadCuentasCorrientes(getLoggedUser().getDni())){
							addActionError(getText("cuentas.tipo.cc.maximo.exedido"));
					} 
				} else {
					if (tipo.getMaximo() <= gestionCuentasService.cantidadCajaAhorro(getLoggedUser().getDni())){
						addActionError(getText("cuentas.tipo.ca.maximo.exedido"));
					}
				}
			} catch (PersonalisedException e) {
				addActionError(getText("error.critico"));
			}
		}
		if (descubierto == null){
			addFieldError("descubierto", getText("forms.requerido"));
		} else {
			if (BigDecimal.ZERO.compareTo(descubierto) == 1){
				addFieldError("descubierto", getText("forms.minimo.zero"));
			}
		}
	}
	
	public String execute() throws PersonalisedException {
		
		Cuenta cta = new Cuenta();
		
		cta.setDescubierto(descubierto);
		cta.setEstadoCuenta(EstadoCuenta.HABILITADA);
		cta.setSaldo(BigDecimal.ZERO);
		cta.setTipoCuenta(tipo);
		try{
			gestionCuentasService.crearCuenta(cta, getLoggedUser().getDni());
		} catch (PersonalisedException e) {
			addActionError(getText("error.critico"));
			return ERROR;
		}
		
		
		return SUCCESS;
	}
	
	public String init(){
		return SUCCESS;
	}

	/**
	 * @return the tipo
	 */
	public TipoCuenta getTipo() {
		return tipo;
	}

	/**
	 * @param tipo the tipo to set
	 */
	public void setTipo(TipoCuenta tipo) {
		this.tipo = tipo;
	}

	/**
	 * @return the tipoValues
	 */
	public TipoCuenta[] getTipoValues() {
		return tipoValues;
	}

	/**
	 * @param tipoValues the tipoValues to set
	 */
	public void setTipoValues(TipoCuenta[] tipoValues) {
		this.tipoValues = tipoValues;
	}

	/**
	 * @return the gestionCuentasService
	 */
	public GestionCuentasService getGestionCuentasService() {
		return gestionCuentasService;
	}

	/**
	 * @param gestionCuentasService the gestionCuentasService to set
	 */
	public void setGestionCuentasService(GestionCuentasService gestionCuentasService) {
		this.gestionCuentasService = gestionCuentasService;
	}

	/**
	 * @return the descubierto
	 */
	public BigDecimal getDescubierto() {
		return descubierto;
	}

	/**
	 * @param descubierto the descubierto to set
	 */
	public void setDescubierto(BigDecimal descubierto) {
		this.descubierto = descubierto;
	}

}
